package com.linkgie.galaxyframework.metadata;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 数据主键标注<p>
 * 
 * 用于将实体类型（由 {@link DataEntity} 标注的类型）中的字段标注为主键；<br>
 * 被标注的字段的类型必须是单值类型（{@link StandardType#INT}）、（{@link StandardType#TEXT}）、（{@link StandardType#TIMESTAMP}）之一；<p>
 * 
 * 一个实体类型的字段中可以有一个或者多个字段标注 {@link DataKey} ；<p>
 * 
 * 当只有一个字段标注为 {@link DataKey} 时，该字段被视为实体的唯一主键；<p>
 * 
 * 当有多个字段标注为 {@link DataKey} 时，其中最多只能有一个（或者没有）唯一主键字段（标注字段的 {@link DataKey#union()} 设置为 false） ； <br>
 * 而其它（或者全部）的标注字段必须把 {@link DataKey#union()} 设置为 true ，表示多个标注字段一起作为实体的联合主键；<p>
 * 
 * 在应用“引用字段( {@link DataReference} )”时，如果引用的实体类型标注了多个联合主键字段，则“引用字段”的数据类型是简单类型（非对象类型），则要求“引用字段”的数据类型同时必须是数组；
 * 
 * <p>
 * 注：仅适用于实体类型（由 {@link DataEntity} 标注的类型）中的字段；<br>
 * 把 {@link DataKey} 标注到 {@link DataInterface} 标注的类型上是没有意义的，不会被识别和解析；
 * 
 * @author huanghaiquan
 *
 */
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataKey {

	/**
	 * 是否为联合主键；<p>
	 * 
	 * 默认为 false； <br>
	 * 
	 * @return
	 */
	boolean union() default false;

}
